package dicionario;
import java.io.BufferedReader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public class Indice {
	Map<String, Integer> mapa;

	public Indice() {
		LinkedHashMap<String, Integer> mapa = new LinkedHashMap<String, Integer>();
		this.mapa = Collections.synchronizedMap(mapa);
		//GUI i = new GUI();
		try {
			this.preencherIndice();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public Map<String, Integer> getMapa() {
		return this.mapa;
	}

	public void preencherIndice() throws IOException {
		lerPalavrasChaves();
		lerDefinicao();
	}

	public void lerPalavrasChaves() throws IOException {
		BufferedReader aux = null;
		String linha, token[] = null, t = null;
		int pos = 1, fim;

		try {
			aux = new BufferedReader(new FileReader("lista"));
			linha = aux.readLine();
			// retirando apenas as palavras chaves
			while (linha.charAt(0) == '<') {
				fim = 0;
				for (char c = linha.charAt(1); c != '>'; fim++) {
					c = linha.charAt(fim);
				}
				t = linha.substring(1, fim - 1);
				if (t.contains(" ' ")) {
					token = t.split(" ' ", 2);
					mapa.put(token[0].toLowerCase(), pos);
					mapa.put(token[1].toLowerCase(), pos);
				} else
					mapa.put(t.toLowerCase(), pos);
				linha = aux.readLine();

				pos++;
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (aux != null)
				aux.close();
		}
	}

	public void lerDefinicao() throws IOException {
		BufferedReader aux = null;
		String linha, token[] = null, t = null;
		int pos = 1, inicio;

		try {
			aux = new BufferedReader(new FileReader("lista"));
			linha = aux.readLine();
			// retirando apenas as palavras chaves
			while (linha.charAt(0) != '$') {
				inicio = 0;

				for (char c = linha.charAt(1); c != '>'; inicio++) {
					c = linha.charAt(inicio);
				}
				t = linha.substring(inicio);

				token = t.split("[,-.\"/ :;=?()_{|}~]");
				for (int i = 0; i < token.length; i++) {
					if (!seStopWord(token[i].toLowerCase()) && !mapa.containsKey(token[i].toLowerCase()))
						mapa.put(token[i].toLowerCase(), pos);
				}

				linha = aux.readLine();
				pos++;
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (aux != null)
				aux.close();
		}

	}

	public boolean seStopWord(String str) {
		if (str.equalsIgnoreCase("a") || str.equalsIgnoreCase("de")
				|| str.equalsIgnoreCase("e") || str.equalsIgnoreCase("uma")
				|| str.equalsIgnoreCase("um") || str.equalsIgnoreCase("com")
				|| str.equalsIgnoreCase("em") || str.equalsIgnoreCase("na")
				|| str.equalsIgnoreCase("ou") || str.equalsIgnoreCase("é")
				|| str.equalsIgnoreCase("pelo") || str.equalsIgnoreCase("o")
				|| str.equalsIgnoreCase("que") || str.equalsIgnoreCase("por")
				|| str.equalsIgnoreCase("para") || str.equalsIgnoreCase("se")
				|| str.equalsIgnoreCase("não") || str.equalsIgnoreCase("dos")
				|| str.equalsIgnoreCase("da") || str.equalsIgnoreCase("do")
				|| str.equalsIgnoreCase("para"))
			return true;
		return false;
	}

	public String pesquisar(String palavra) throws IOException {
		BufferedReader aux = null;
		String linha = null;
		int soma = 0;
		palavra = palavra.toLowerCase();
		
		if(mapa.get(palavra) == null) return "Palavra nao encontrada no banco de dados!";

		try {
			aux = new BufferedReader(new FileReader("lista"));
			linha = aux.readLine();
			for (soma = 1; soma < mapa.get(palavra); soma++){
				linha = aux.readLine();
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (aux != null)
				aux.close();
		}
		
		linha = linha.replace("'", " - ");
		linha = linha.replace("<", "");
		linha = linha.replace(">", "\n\n");
		
		return linha;

	}

	public void inserir(final String palavra, final String definicao){
		RandomAccessFile lista = null;
		String tokens[] = null;
		int pos = 0;
		
		try {
			lista = new RandomAccessFile("lista", "rw");
			while(lista.readLine().charAt(0)!='$') pos++;
			mapa.put(palavra.toLowerCase(), pos+1);
			tokens = definicao.split("[,-.\"/ :;=?()_{|}~]");
			for (int i = 0; i < tokens.length; i++) {
				if (!seStopWord(tokens[i].toLowerCase()) && !mapa.containsKey(tokens[i].toLowerCase()))
					mapa.put(tokens[i].toLowerCase(), pos+1);
			}
			lista.seek(lista.length()-2);
			lista.writeBytes("\n<"+palavra+"> "+definicao+"\n$");
			lista.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}